package com.pattern.proxy.v7;

import java.util.Random;

/**
 * 被代理对象使用接口的方式
 * 该方式可以实现代理的组合
 *
 * 《该方式就是真正的静态代理》
 *
 * v07: 代理的对象改为Moveable类型-越来越像decorator了
 */
public class Tank implements Movable {
    @Override
    public void move() {
        System.out.println("tank moving ");
        try {
            Thread.sleep(new Random().nextInt(10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
//        new TankTimeProxy(new TankLogProxy()).move();
        // 先日志后时间
        new TankLogProxy(
                new TankTimeProxy(new Tank())
        ).move();

        System.out.println("-----------------------");

        // 先时间后日志
        new TankTimeProxy(
                new TankLogProxy(new Tank())
        ).move();
    }
}

/**
 * Tank时间代理类， 内部添加一个成员变量
 */
class TankTimeProxy implements Movable {

    /**
     * 被代理人: Tank
     *
     */
    Movable m;

    public TankTimeProxy(Movable m) {
        this.m = m;
    }

    @Override
    public void move() {
        Long start = System.currentTimeMillis();
        m.move();
        Long end = System.currentTimeMillis();
        System.out.println("运行时间： " + (end -start));
    }
}

/**
 * Tank日志代理类， 内部添加一个成员变量
 */
class TankLogProxy implements Movable {

    /**
     * 被代理对象是 TankTimeProxy
     */
    Movable m;

    public TankLogProxy(Movable m) {
        this.m = m;
    }

    @Override
    public void move() {
        System.out.println("tank 开始执行。。。。。。。。");
        m.move();
        System.out.println("tank 执行结束。。。。。。。。。。。");
    }

}

interface Movable {
    void move();
}